package com.quaidi.smartlocker.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

/**
 * 密码加密工具类
 * 
 * @author QuaiDi
 * @since 2025-08-26
 */
public class PasswordUtil {
    
    private static final String SALT_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    private static final int SALT_LENGTH = 16;
    
    /**
     * 生成随机盐值
     * 
     * @return 盐值
     */
    public static String generateSalt() {
        Random random = new Random();
        StringBuilder salt = new StringBuilder();
        for (int i = 0; i < SALT_LENGTH; i++) {
            salt.append(SALT_CHARS.charAt(random.nextInt(SALT_CHARS.length())));
        }
        return salt.toString();
    }
    
    /**
     * MD5加密
     * 
     * @param text 待加密文本
     * @return 加密后的文本
     */
    public static String md5(String text) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] bytes = md.digest(text.getBytes());
            StringBuilder sb = new StringBuilder();
            for (byte b : bytes) {
                sb.append(String.format("%02x", b));
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("MD5加密失败", e);
        }
    }
    
    /**
     * 加密密码（密码 + 盐值）
     * 
     * @param password 原始密码
     * @param salt 盐值
     * @return 加密后的密码
     */
    public static String encryptPassword(String password, String salt) {
        return md5(password + salt);
    }
    
    /**
     * 验证密码
     * 
     * @param inputPassword 输入的密码
     * @param salt 盐值
     * @param encryptedPassword 加密后的密码
     * @return 密码是否正确
     */
    public static boolean verifyPassword(String inputPassword, String salt, String encryptedPassword) {
        String encrypted = encryptPassword(inputPassword, salt);
        return encrypted.equals(encryptedPassword);
    }
    
    /**
     * 简单MD5加密（无盐值，兼容旧系统）
     * 
     * @param password 密码
     * @return 加密后的密码
     */
    public static String simpleEncrypt(String password) {
        return md5(password + "smartlocker");
    }
    
    /**
     * 验证简单加密的密码（无盐值，兼容旧系统）
     * 
     * @param inputPassword 输入的密码
     * @param encryptedPassword 加密后的密码
     * @return 密码是否正确
     */
    public static boolean verifySimplePassword(String inputPassword, String encryptedPassword) {
        return simpleEncrypt(inputPassword).equals(encryptedPassword);
    }
}